﻿#pragma once
typedef unsigned int uint;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//注意，通常一个汉字在utf-8占3字节，cadata大小为64字节
//汉字编码长度不能超过63字节
#define NAME_OVERLONG "输入的字符长度超过(包含等于)32字节"
#define UNKNOW_ERROR "未知错误，请刷新后重试"
#define REGIST_OK "注册成功"
#define REGIST_FAILED "注册失败，用户名已存在"

#define LOGIN_OK "登录成功"
#define LOGIN_FAILED "登录失败，用户名或密码错误，或重复登录"
#define LOGIN_OK_VIP "🐢小龟龟登录成功啦！🐢"

#define CREATE_DIR_OK "新建成功"
#define DIR_NO_EXIST "新建失败，当前目录不存在"
#define FILE_NAME_EXIST "新建失败，当前文件名已存在"

#define DEL_DIR_OK "删除文件夹成功"
#define DEL_DIR_FAILED "删除失败，所选非文件夹！"

#define FLUSH_FILE_FAILED "当前目录内容获取失败，请重启或重试"

#define RENAME_OK "重命名文件(夹)成功"
#define RENAME_FAILED "重命名文件(夹)失败，请重试"

#define ENTER_DIR_FAILED "打开失败，所选非文件夹"

#define UPLOAD_OK "文件上传成功"
#define UPLOAD_FAILED "文件传输出错：大小不匹配"
#define UPLOAD_FAILED_FILE_NO_EXIST "文件上传失败，目标文件丢失"

#define DEL_FILE_OK "文件删除成功"
#define DEL_FILE_FAILED "文件删除失败，所选为文件夹"

#define DOWNLOAD_FILE_OK "文件下载成功"
#define DOWNLOAD_FILE_FAILED "文件下载失败"

#define USER_NOT_EXIST "用户不存在"
#define USER_NOT_ONLINE "用户不在线"
#define USER_IS_ONLINE "用户在线"

#define FRIEND_ALREADY_EXIST "朋友关系已存在"
#define FRIEND_REQUEST_SEND "已发送好友请求"
#define ADD_FRIEND_ACCEPTED	"已成功添加好友!"
#define ADD_FRIEND_REFUSED	"请求被对方拒绝..."

enum ENUM_MESSAGE_TYPE {
	ENUM_MESSAGE_TYPE_MIN = 0,
	ENUM_MESSAGE_TYPE_REGIST_REQUEST,
	ENUM_MESSAGE_TYPE_REGIST_RESPOND,
	ENUM_MESSAGE_TYPE_LOGIN_REQUEST,
	ENUM_MESSAGE_TYPE_LOGIN_RESPOND,
	ENUM_MESSAGE_TYPE_LOGOUT_REQUEST,
	ENUM_MESSAGE_TYPE_LOGOUT_RESPOND,
	ENUM_MESSAGE_TYPE_CREATE_DIR_REQUEST,	//创建文件夹请求
	ENUM_MESSAGE_TYPE_CREATE_DIR_RESPOND,	//创建文件夹回复
	ENUM_MESSAGE_TYPE_DELETE_DIR_REQUEST,	//删除文件请求
	ENUM_MESSAGE_TYPE_DELETE_DIR_RESPOND,	//删除文件回复
	ENUM_MESSAGE_TYPE_FLUSH_FILE_REQUEST,	//刷新文件请求
	ENUM_MESSAGE_TYPE_FLUSH_FILE_RESPOND,	//刷新文件回复
	ENUM_MESSAGE_TYPE_FLUSH_FILE_RESPOND_FAILED,	//刷新文件回复(失败)
	ENUM_MESSAGE_TYPE_RENAME_FILE_REQUEST,	//重命名文件请求
	ENUM_MESSAGE_TYPE_RENAME_FILE_RESPOND,	//重命名文件回复
	ENUM_MESSAGE_TYPE_ENTER_DIR_REQUEST,	//进入文件夹请求
	ENUM_MESSAGE_TYPE_ENTER_DIR_RESPOND,	//进入文件夹回复(仅失败时发送)
	ENUM_MESSAGE_TYPE_UPLOAD_FILE_REQUEST,	//上传文件请求
	ENUM_MESSAGE_TYPE_UPLOAD_FILE_RESPOND,	//上传文件回复
	ENUM_MESSAGE_TYPE_DELETE_FILE_REQUEST,	//删除文件请求
	ENUM_MESSAGE_TYPE_DELETE_FILE_RESPOND,	//删除文件回复
	ENUM_MESSAGE_TYPE_DOWNLOAD_FILE_REQUEST,	//下载文件请求
	ENUM_MESSAGE_TYPE_DOWNLOAD_FILE_RESPOND,	//下载文件回复
	ENUM_MESSAGE_TYPE_DOWNLOAD_FILE_DATA_REQUEST,	//下载文件数据请求

	ENUM_MESSAGE_TYPE_ALL_ONLINE_REQUEST,	//显示所有在线用户请求
	ENUM_MESSAGE_TYPE_ALL_ONLINE_RESPOND,	//显示所有在线用户回复
	ENUM_MESSAGE_TYPE_SEARCH_USER_REQUEST,	//搜索用户请求
	ENUM_MESSAGE_TYPE_SEARCH_USER_RESPOND,	//搜索用户回复
	ENUM_MESSAGE_TYPE_ADD_FRIEND_REQUEST,	//加好友请求
	ENUM_MESSAGE_TYPE_ADD_FRIEND_RESPOND,	//加好友回复

	ENUM_MESSAGE_TYPE_MAX = 0x00ffffff,
};

struct FileInfo {
	char caFileName[32];	//文件名字
	int iFileType;			//文件类型
};

struct PDU {
	// size of entire PDU's length
	uint uiPDULen;
	// typre of this message
	uint uiMsgType;
	// name of which this message belongs
	char caData[64];
	// size of this message
	uint uiMsgLen;
	// the message saved in elastic structure
	/**
	* 具体存放内容：当前文件目录
	*/
	int caMsg[];
};

PDU* mkPDU(uint uiMsgLen);